/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.gui.frames.internos;

import controle.gui.frames.ControleFramePrincipal;
import controle.gui.frames.internos.superclasses.Controle;
import controle.gui.utils.ApagaElementosDaInterface;
import controle.gui.utils.EnabledGUIElements;
import controle.gui.utils.TamanhoJTextField;
import controle.gui.utils.setEnabledGUIElements;
import controle.interfaces.Constantes;
import controle.utils.Datas;
import controle.utils.Horas;
import controle.utils.ReportUtils;
import gui.componentes.JFileChooserCroqui;
import gui.frames.internos.IFLocalidades;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Date;
import java.sql.Time;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import modelo.Localidade;
import modelo.Municipio;
import persistencia.arquivo.ManipulaArquivos;
import persistencia.dao.AbstractDAO;
import persistencia.dao.TransacaoDAO;
import persistencia.session.ConnectionFactory;

/**
 *
 * @author Maycon Fernando Silva Brito
 * @author mayconfsbrito@gmail.com
 */
public class ControleLocalidades extends Controle {

    /**
     * Variáveis da classe
     */
    private IFLocalidades frame = null;

    /**
     * Construtor da classe
     */
    public ControleLocalidades(IFLocalidades frame) {
        super(frame);
        this.frame = frame;
    }

    /**
     * Inicializa o frame
     */
    public void inicializa() {

        //Torna o frame visível
        frame.setVisible(true);

        //Limita o tamanho do JTextField
        TamanhoJTextField.limitaTamanho(new int[]{100, 100}, frame.textNome, frame.textBuscaNome);

        this.limparGUI();

        //Inicializa eventos da tabela
        frame.tabela.getSelectionModel().addListSelectionListener(frame.listener);
        frame.tabela.getColumnModel().getSelectionModel().addListSelectionListener(frame.listener);

    }

    /**
     * Especificações em @InternalFrame
     */
    public void guiAtiva(boolean estado) {
        if (estado) {
            setEnabledGUIElements.enabledJComponent(frame.buttonCadastro);
            setEnabledGUIElements.disabledJComponent(frame.buttonAlterar, frame.buttonCroquiVisualizar, frame.buttonCroquiRemover, frame.buttonCroquiAlterar, frame.buttonCroquiAnexar);

        } else {
            setEnabledGUIElements.enabledJComponent(frame.buttonAlterar, frame.buttonCroquiVisualizar, frame.buttonCroquiRemover, frame.buttonCroquiAlterar, frame.buttonCroquiAnexar);
            setEnabledGUIElements.disabledJComponent(frame.buttonCadastro);
        }
    }

    /**
     * Verifica o acesso do usuário para utilizar o frame
     */
    protected void verificaAcessos() {

        /*
         * Verifica a permissao de @user para este frame
         */
        if (!ControleFramePrincipal.acessos.get(Constantes.PERMISSAO_CADASTRA_ALTERA_LOCAIS).isAcesso()) {
            EnabledGUIElements.disabledJComponent(frame.buttonCadastro, frame.buttonAlterar,
                    frame.buttonCroquiAlterar, frame.buttonCroquiAnexar, frame.buttonCroquiRemover, frame.buttonCroquiVisualizar);
        }

        if (!ControleFramePrincipal.acessos.get(Constantes.PERMISSAO_CADASTRA_ALTERA_CROQUI).isAcesso()) {
            setEnabledGUIElements.disabledJComponent(frame.buttonCroquiAnexar, frame.buttonCroquiAlterar, frame.buttonCroquiRemover);
        }

        if (!ControleFramePrincipal.acessos.get(Constantes.PERMISSAO_CONSULTA_CROQUI).isAcesso()) {
            setEnabledGUIElements.disabledJComponent(frame.buttonCroquiAnexar, frame.buttonCroquiAlterar, frame.buttonCroquiRemover, frame.buttonCroquiVisualizar);
        }

    }

    /**
     * Limpa os componentes do frame
     */
    public void limparGUI() {

        frame.tabela.clearSelection();
        new ApagaElementosDaInterface().apagaJTextField(frame.textId, frame.textNome, frame.textCodigoMunicipio, frame.textNomeMunicipio, frame.textDataCroqui,
                frame.textHoraCroqui, frame.textCodigo);
        frame.textCodigo.setEnabled(false);

        //Configura o comportamento da gui de acordo com as permissões do usuário
        this.guiAtiva(true);
        this.verificaAcessos();
    }

    /**
     * Preenche todos os componentes da GUI a partir do objeto selecionado na
     * tabela
     */
    public void tabelaPreencheGUI() {

        int linha = frame.tabela.getSelectedRow();
        Integer cod;
        try {
            cod = (Integer) frame.tabela.getValueAt(linha, 0);
        } catch (IndexOutOfBoundsException er) {
            cod = 0;
            return;
        }
        
        List<Localidade> consulta = AbstractDAO.consultar("from Localidade l LEFT JOIN FETCH l.municipio m WHERE idLocalidade=" + cod);

        if (consulta.size() > 0) {
            Localidade loc = consulta.get(0);
            frame.textId.setText(Integer.toString(loc.getIdLocalidade()));
            frame.textCodigo.setText(loc.getCodigo().toString());
            frame.textNome.setText(loc.getNome());
            frame.textCodigoMunicipio.setText(loc.getMunicipio().getCodigo());
            frame.textNomeMunicipio.setText(loc.getMunicipio().getNome());

            if (loc.getDataCroqui() != null && loc.getHoraCroqui() != null) {
                frame.textDataCroqui.setText(Datas.toString(loc.getDataCroqui()));
                frame.textHoraCroqui.setText(loc.getHoraCroqui().toString());
            } else {
                new ApagaElementosDaInterface().apagaJTextField(frame.textDataCroqui, frame.textHoraCroqui);
            }

            //Configura o comportamento dos botões da interface
            frame.buttonCadastro.setEnabled(false);
            EnabledGUIElements.enabledJComponent(frame.buttonAlterar, frame.buttonCroquiVisualizar);
            this.guiAtiva(false);
            if (loc.isCroqui()) {
                EnabledGUIElements.enabledJComponent(frame.buttonCroquiAlterar, frame.buttonCroquiRemover, frame.buttonCroquiVisualizar);
                EnabledGUIElements.disabledJComponent(frame.buttonCroquiAnexar);
            } else {
                EnabledGUIElements.disabledJComponent(frame.buttonCroquiAlterar, frame.buttonCroquiRemover, frame.buttonCroquiVisualizar);
                EnabledGUIElements.enabledJComponent(frame.buttonCroquiAnexar);
            }
            this.verificaAcessos();

        }
    }

    /**
     * Especificações do método em @InternalFrame
     */
    protected void listarTodosElementosNaTabela() {

        List<Localidade> list = AbstractDAO.listarSemFecharSessao("Localidade");
        listarPesquisaNaTabela(list);
    }

    /**
     * Especificações do método em @InternalFrame
     */
    private void listarPesquisaNaTabela(List<Localidade> list) {

        frame.tabela.getColumnModel().getColumn(0).setPreferredWidth(30);
        frame.tabela.getColumnModel().getColumn(1).setPreferredWidth(50);
        frame.tabela.getColumnModel().getColumn(2).setPreferredWidth(250);
        frame.tabela.getColumnModel().getColumn(3).setPreferredWidth(50);
        frame.tabela.getColumnModel().getColumn(4).setPreferredWidth(200);
        frame.tabela.getColumnModel().getColumn(5).setPreferredWidth(30);

        DefaultTableModel modelo = (DefaultTableModel) frame.tabela.getModel();
        modelo.setNumRows(0);
        limparGUI();

        try {
            if (list != null) {
                for (int i = 0; i < list.size(); i++) {

                    Localidade loc = list.get(i);
                    modelo.addRow(new Object[]{loc.getIdLocalidade(), loc.getCodigo(), loc.getNome(), loc.getMunicipio().getCodigo(),
                                loc.getMunicipio().getNome(), loc.toStringCroqui()});
                }
            }
        } catch (Exception er) {
            JOptionPane.showMessageDialog(frame, "Erro ao listar os objetos na tabela!\n\n" + er, "Erro na listagem!", JOptionPane.ERROR_MESSAGE);
            er.printStackTrace();
        }

        /*
         * Permite o evento de ordernar a tabela a partir do click do mouse
         */
        frame.tabela.setAutoCreateRowSorter(true);
    }

    /**
     * Instancia a localidade a partir dos elementos da interface gráfica
     *
     * @return
     */
    public Localidade criaLocalidade(int opcao) {

        //Caso o usuário confirme o evento
        if (opcao == JOptionPane.YES_OPTION) {

            //Verifica se o nome da localidade está preenchido
            if (!frame.textNome.getText().trim().isEmpty()) {

                //Verifica se o código foi preenchido
                if (!frame.textCodigo.getText().trim().isEmpty()) {

                    //Verifica se o código do município foi escrito
                    if (!frame.textCodigoMunicipio.getText().trim().isEmpty()) {

                        //Verifica se o município existe
                        if (AbstractDAO.consultar("Municipio", "codigo='" + frame.textCodigoMunicipio.getText().trim() + "'").isEmpty()) {
                            JOptionPane.showMessageDialog(frame, "Código de município inexistente.", "Código de município inválido!", JOptionPane.WARNING_MESSAGE);
                            return null;
                        }

                        //Instancia as variáveis
                        int codigo = Integer.parseInt(frame.textCodigo.getText().trim());
                        String nome = frame.textNome.getText();
                        Municipio mun = (Municipio) AbstractDAO.consultar("Municipio", "codigo='" + frame.textCodigoMunicipio.getText().trim() + "'").get(0);
                        Date dataCroqui = Datas.getDate(frame.textDataCroqui.getText());
                        Time horaCroqui = null;
                        try {
                            horaCroqui = Horas.getTime(frame.textHoraCroqui.getText());
                        } catch (ParseException ex) {
                            JOptionPane.showMessageDialog(frame, "Erro ao manipular a hora de sincronização do croqui.", "Erro", JOptionPane.YES_OPTION);
                            ex.printStackTrace();
                        }
                        Localidade loc = new Localidade(mun, codigo, nome, false, dataCroqui, horaCroqui);

                        //Verifica o id da localidade
                        if (!frame.textId.getText().trim().isEmpty()) {
                            loc.setIdLocalidade(Integer.parseInt(frame.textId.getText().trim()));

                            //Busca a localidade no bd e seta se a mesma ja tem um croqui anexo
                            Localidade locBd = (Localidade) AbstractDAO.consultar("Localidade", "idLocalidade=" + loc.getIdLocalidade()).get(0);
                            loc.setCroqui(locBd.isCroqui());

                        } else {
                            loc.setIdLocalidade(AbstractDAO.max(Localidade.class, "idLocalidade") + 1);
                        }

                        //Verifica se as restrições de código estão sendo respeitadas
                        if (this.verificaCodigoRepetido(loc)) {
                            JOptionPane.showMessageDialog(frame, "Atenção! Já existe uma localidade deste município cadastrada com o mesmo código.", "Código repetido!", JOptionPane.WARNING_MESSAGE);
                            return null;
                        }

                        //Retorna o objeto
                        return loc;

                    } else {
                        JOptionPane.showMessageDialog(frame, "Atenção! O município deve ser selecionado.", "Município não selecionado!", JOptionPane.WARNING_MESSAGE);
                    }
                } else {
                    JOptionPane.showMessageDialog(frame, "Atenção! O codigo da localidade deve ser preenchido.", "Codigo não preenchido!", JOptionPane.WARNING_MESSAGE);

                }

            } else {
                JOptionPane.showMessageDialog(frame, "Atenção! O nome da localidade deve ser preenchido.", "Nome não preenchido!", JOptionPane.WARNING_MESSAGE);

            }
        }
        return null;

    }

    /**
     * Cadastra uma localidade através do frame
     */
    public void cadastrar() {

        //Pergunta ao usuário se ele deseja realizar o cadastro
        int opcao = JOptionPane.showOptionDialog(frame, "Tem certeza que deseja cadastrar " + frame.textNome.getText()
                + "?", "Cadastro de localidade", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, frame.botoesOpcoes, frame.botoesOpcoes[0]);

        //Captura o objeto no frame
        Localidade loc = this.criaLocalidade(opcao);

        //Realiza o cadastro
        if (loc != null) {
            if (AbstractDAO.cadastrar(loc)) {
                JOptionPane.showMessageDialog(frame, "Localidade cadastrada com sucesso!", "Cadastro.", JOptionPane.INFORMATION_MESSAGE);
                this.limparGUI();
                this.buscar();

                //Log do Agente
                TransacaoDAO.cadastrar("Cadastrou a localidade cod=" + loc.getCodigo() + " municipio=" + loc.getMunicipio().getCodigo() + ".");
                        
            }
        }

    }

    /**
     * Altera uma localidade através do frame
     */
    public void alterar() {

        //Pergunta ao usuário se ele deseja realizar o cadastro
        int opcao = JOptionPane.showOptionDialog(frame, "Tem certeza que deseja alterar a localidade " + frame.textNome.getText()
                + "?", "Alteração de localidade", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, frame.botoesOpcoes, frame.botoesOpcoes[0]);

        //Captura o objeto no frame
        Localidade loc = this.criaLocalidade(opcao);

        //Realiza o cadastro
        if (loc != null) {

            //Mantém a data e hora de anexão do croqui que já estava no bd
            Localidade locBd = (Localidade) AbstractDAO.consultar("Localidade", "idLocalidade=" + loc.getIdLocalidade()).get(0);
            loc.setDataCroqui(locBd.getDataCroqui());
            loc.setHoraCroqui(locBd.getHoraCroqui());

            if (AbstractDAO.alterar(loc)) {
                JOptionPane.showMessageDialog(frame, "Localidade Alterada com sucesso!", "Alteração.", JOptionPane.INFORMATION_MESSAGE);
                this.limparGUI();
                this.buscar();

                //Log do Agente
                TransacaoDAO.cadastrar("Alterou a localidade id=" + loc.getIdLocalidade() + ".");
            }
        }

    }

    /**
     * Exclui uma localidade através do frame
     */
    public void excluir() {

        //Pergunta ao usuário se ele deseja realizar o cadastro
        int opcao = JOptionPane.showOptionDialog(frame, "Tem certeza que deseja excluir a localidade " + frame.textNome.getText()
                + "?", "Exclusão de localidade", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, frame.botoesOpcoes, frame.botoesOpcoes[0]);

        //Captura o objeto no frame
        Localidade loc = this.criaLocalidade(opcao);

        //Realiza o cadastro
        if (loc != null) {
            if (AbstractDAO.excluir(loc)) {
                JOptionPane.showMessageDialog(frame, "Localidade excluída com sucesso!", "Exclusão.", JOptionPane.INFORMATION_MESSAGE);
                this.limparGUI();
                this.buscar();
            }
        }

    }

    /**
     * Realiza a busca de um determinado objeto a partir dos parâmetros
     * definidos no @frame
     */
    public void buscar() {

        //Captura os parametros do frame
        String codigo = frame.textBuscaCodigo.getText();
        String nome = frame.textBuscaNome.getText();
        String codigoMunicipio = frame.textBuscaCodigoMunicipio.getText();

        //Realiza a busca no bd
        //Captura o id do município caso ele tenha sido selecionado
        List<Localidade> list = null;

        //Incrementa a string para consutar a busca
        String query = "";
        if (codigo != null && !codigo.trim().equals("")) {
            query += "l.codigo like '%" + codigo + "%' ";
        }
        if (codigoMunicipio != null && !codigoMunicipio.isEmpty()) {
            if (query.length() > 1) {
                query += " AND ";
            }

            //Verifica se o código do município existe
            List<Municipio> listMun = AbstractDAO.consultar("Municipio", "codigo='" + codigoMunicipio + "'");
            if (listMun.size() > 0) {
                Municipio mun = listMun.get(0);
                query += "m.idMunicipio=" + mun.getIdMunicipio();
                frame.textBuscaNomeMunicipio.setText(mun.getNome());

            } else {
                JOptionPane.showMessageDialog(frame, "Não existe nenhum município com este código.", "Código de município existente!",
                        JOptionPane.WARNING_MESSAGE);
                return;
            }

        }
        if (nome != null && !nome.trim().equals("")) {
            if (query.length() > 1) {
                query += " AND ";
            }
            query += " l.nome like '%" + nome + "%' ";
        }

        if (!query.equals("")) {
            //System.out.println(query);
            list = (List<Localidade>) AbstractDAO.consultar("from Localidade l LEFT JOIN FETCH l.municipio m WHERE " + query);
        }

        //Lista os objetos encontrados na tabela
        if (list != null) {
            this.listarPesquisaNaTabela(list);
        } else {
            this.listarPesquisaNaTabela(null);
        }

    }

    /**
     * Limpa apenas os componentes de busca e lista a tabela de objetos com
     * todos os objetos do bd
     */
    public void limparBusca() {

        new ApagaElementosDaInterface().apagaJTextField(frame.textBuscaNome, frame.textBuscaCodigo, frame.textBuscaCodigoMunicipio, frame.textBuscaNomeMunicipio);
        this.listarPesquisaNaTabela(null);

    }

    /**
     * Abre um relatório para visualizar o croqui da localidade selecionada na
     * tabela
     */
    public void visualizarCroqui() {

        InputStream inputStream = null;
        Map parametros = new HashMap();

        if (!frame.textId.getText().isEmpty()) {

            inputStream = getClass().getResourceAsStream("/Croqui.jasper");

            try {
                FileInputStream imagem = new FileInputStream("croquis/" + Integer.parseInt(frame.textId.getText().trim()) + ".png");
                parametros.put("idLocalidade", Integer.parseInt(frame.textId.getText()));
                parametros.put("imagem", imagem);

                ReportUtils.openReport("Croqui da Localidade", inputStream, parametros, ConnectionFactory.getConnection());
                imagem.close();

            } catch (Exception er) {

                JOptionPane.showMessageDialog(null, "Erro ao criar o relatório para abrir o croqui.\n" + er, "Erro", JOptionPane.ERROR_MESSAGE);
                er.printStackTrace();
            }

        } else {
            JOptionPane.showMessageDialog(null, "Selecione uma localidade na tabela com croqui para imprimir.", "Atenção",
                    JOptionPane.WARNING_MESSAGE);
        }
    }

    /**
     * Anexa um croqui a localidade
     */
    public void anexarCroqui() {

        //Verifica se a localidade foi selecionada
        if (!frame.textId.getText().isEmpty()) {

            //Consulta a localidade no bd
            Localidade loc = (Localidade) AbstractDAO.consultar("from Localidade l LEFT JOIN FETCH l.municipio m WHERE idLocalidade=" + Integer.parseInt(frame.textId.getText().trim())).get(0);

            //Verifica se a localidade não tem um croqui cadastrado
            if (!loc.isCroqui()) {
                try {
                    //Seleciona o local do croqui através de um JFileChooser
                    JFileChooserCroqui fileChooser = new JFileChooserCroqui();
                    int opcao = fileChooser.showOpenDialog(frame);
                    File arquivo = fileChooser.getSelectedFile();

                    //Verifica se o arquivo foi selecionado
                    if (opcao == JFileChooser.APPROVE_OPTION) {
                        //Verifica se o croqui foi copiado para a pasta de imagens de croquis
                        if (ManipulaArquivos.copyFile(arquivo, new File("croquis/" + Integer.parseInt(frame.textId.getText().trim()) + ".png"))) {
                            JOptionPane.showMessageDialog(frame, "Imagem de croqui anexado com sucesso!", "Croqui", JOptionPane.INFORMATION_MESSAGE);

                            //Salva no bd a localidade com o novo croqui e sincroniza a versão do mesmo
                            loc.setCroqui(true);
                            loc.setDataCroqui(Datas.getDataHoje());
                            loc.setHoraCroqui(Horas.getHoraAgora());
                            AbstractDAO.alterar(loc);

                            //Altera o comportamento da GUI
                            setEnabledGUIElements.enabledJComponent(frame.buttonAlterar, frame.buttonCroquiVisualizar, frame.buttonCroquiRemover, frame.buttonCroquiAlterar);
                            setEnabledGUIElements.disabledJComponent(frame.buttonCroquiAnexar);
                            this.buscar();
                            this.verificaAcessos();

                            //Log do Agente
                            TransacaoDAO.cadastrar("Anexou um croqui na localidade cod=" + loc.getCodigo() + " municipio=" + loc.getMunicipio().getCodigo() + ".");
                                    

                        } else {
                            JOptionPane.showMessageDialog(frame, "Erro ao anexar imagem de croqui!", "Croqui", JOptionPane.ERROR_MESSAGE);
                        }

                    }

                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(frame, "Erro ao copiar a imagem do croqui da localidade.", "Erro!",
                            JOptionPane.ERROR_MESSAGE);
                    ex.printStackTrace();
                }


            } else {
                JOptionPane.showMessageDialog(frame, "Esta localidade já tem um croqui cadastrado.", "Atenção",
                        JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(frame, "Selecione na tabela uma localidade já cadastrada para anexar um croqui.", "Atenção",
                    JOptionPane.WARNING_MESSAGE);
        }
    }

    /**
     * Altera o croqui da localidade
     */
    public void alterarCroqui() {
        //Verifica se a localidade foi selecionada
        if (!frame.textId.getText().isEmpty()) {

            //Consulta a localidade no bd
            Localidade loc = (Localidade) AbstractDAO.consultar("from Localidade l LEFT JOIN FETCH l.municipio m WHERE idLocalidade= " + Integer.parseInt(frame.textId.getText().trim())).get(0);

            //Verifica se a localidade já tem um croqui cadastrado
            if (loc.isCroqui()) {
                try {
                    //Seleciona o local do croqui através de um JFileChooser
                    JFileChooserCroqui fileChooser = new JFileChooserCroqui();
                    int opcao = fileChooser.showOpenDialog(frame);
                    File arquivo = fileChooser.getSelectedFile();

                    //Verifica se o arquivo foi selecionado
                    if (opcao == JFileChooser.APPROVE_OPTION) {
                        //Verifica se o croqui foi copiado para a pasta de imagens de croquis
                        if (ManipulaArquivos.copyFile(arquivo, new File("croquis/" + Integer.parseInt(frame.textId.getText().trim()) + ".png"))) {
                            //Sincroniza a versão do croqui e salva no bd
                            loc.setDataCroqui(Datas.getDataHoje());
                            loc.setHoraCroqui(Horas.getHoraAgora());
                            if (AbstractDAO.alterar(loc)) {
                                JOptionPane.showMessageDialog(frame, "Imagem de croqui alterada com sucesso!", "Croqui", JOptionPane.INFORMATION_MESSAGE);

                                //Log do Agente
                                TransacaoDAO.cadastrar("Alterou o croqui da localidade cod=" + loc.getCodigo() + " municipio=" + loc.getMunicipio().getCodigo() + ".");
                            }

                            //Verifica as permissões de acesso
                            this.verificaAcessos();
                        } else {
                            JOptionPane.showMessageDialog(frame, "Erro ao alterar a imagem do croqui!", "Croqui", JOptionPane.ERROR_MESSAGE);
                        }

                    }

                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(frame, "Erro ao copiar a imagem do croqui da localidade.", "Erro!",
                            JOptionPane.ERROR_MESSAGE);
                    ex.printStackTrace();
                }
            } else {
                JOptionPane.showMessageDialog(frame, "Esta localidade ainda não tem um croqui anexado.", "Atenção",
                        JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(frame, "Selecione na tabela uma localidade já cadastrada para anexar um croqui.", "Atenção",
                    JOptionPane.WARNING_MESSAGE);
        }
    }

    /**
     * Remove o croqui da localidade
     */
    public void removerCroqui() {

        //Verifica se a localidade foi selecionada
        if (!frame.textId.getText().isEmpty()) {

            //Consulta a localidade no bd
            Localidade loc = (Localidade) AbstractDAO.consultar("from Localidade l LEFT JOIN FETCH l.municipio m WHERE idLocalidade= " + Integer.parseInt(frame.textId.getText().trim())).get(0);

            //Verifica se a localidade já tem um croqui cadastrado
            if (loc.isCroqui()) {
                try {
                    if (new ManipulaArquivos().deleteFile("croquis/" + loc.getIdLocalidade() + ".png")) {
                        loc.setCroqui(false);
                        loc.setDataCroqui(null);
                        loc.setHoraCroqui(null);
                        if (AbstractDAO.alterar(loc)) {
                            JOptionPane.showMessageDialog(frame, "Imagem de croqui excluida com sucesso!", "Croqui", JOptionPane.INFORMATION_MESSAGE);

                            //Log do Agente
                            TransacaoDAO.cadastrar("Removeu o croqui da localidade cod=" + loc.getCodigo() + " municipio=" + loc.getMunicipio().getCodigo() + ".");
                        }

                        //Altera o comportamento da GUI
                        setEnabledGUIElements.disabledJComponent(frame.buttonAlterar, frame.buttonCroquiVisualizar, frame.buttonCroquiRemover, frame.buttonCroquiAlterar);
                        setEnabledGUIElements.enabledJComponent(frame.buttonCroquiAnexar);
                        this.buscar();
                        this.verificaAcessos();
                    }

                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(frame, "Erro ao excluir a imagem do croqui da localidade.", "Erro!",
                            JOptionPane.ERROR_MESSAGE);
                    ex.printStackTrace();
                }
            } else {
                JOptionPane.showMessageDialog(frame, "Esta localidade ainda não tem um croqui anexado.", "Atenção",
                        JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(frame, "Selecione na tabela uma localidade já cadastrada para anexar um croqui.", "Atenção",
                    JOptionPane.WARNING_MESSAGE);
        }
    }

    /**
     * Verifica no Bd qual o próximo código de localidade para este município e
     * insere em textCodigo
     */
    public boolean getCodigoBd(Municipio mun) {

        if (frame.textCodigo.getText().isEmpty()) {

            for (Integer index = 1; index < 9999; index++) {
                List list = AbstractDAO.consultar("Localidade", "codigo='" + index + "' AND idMunicipio=" + mun.getIdMunicipio());
                if (list.isEmpty()) {
                    frame.textCodigo.setText(index.toString());
                    return true;
                    
                }
            }
        }
        return false;

    }

    /**
     * Evento de textCodigoMunicipio
     *
     * @return
     */
    public boolean textCodigoMunicipio(JTextField textCodigoMunicipio, JTextField textNomeMunicipio) {

        String codigoMun = textCodigoMunicipio.getText().trim();

        //Verifica se o município existe
        List<Municipio> list = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");

        if (list.size() > 0) {
            textNomeMunicipio.setText(list.get(0).getNome());
            this.getCodigoBd(list.get(0));
            frame.textCodigo.setEnabled(true);

        } else {
            new ApagaElementosDaInterface().apagaJTextField(textNomeMunicipio);
            JOptionPane.showMessageDialog(frame, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            frame.textCodigo.setEnabled(false);

            return false;
        }

        return true;
    }

    /**
     * Verifica se as restrições de código do objeto estão sendo respeitadas
     *
     * @return
     */
    public boolean verificaCodigoRepetido(Localidade loc) {

        List<Localidade> list = AbstractDAO.consultar("Localidade", "codigo='" + loc.getCodigo() + "' AND idMunicipio=" + loc.getMunicipio().getIdMunicipio() + " AND idLocalidade!=" + loc.getIdLocalidade());
        if (!list.isEmpty()) {
            return true;
        }

        return false;
    }
}
